#pragma once

#ifndef Type_h
#define Type_h

#include <string>
#include <map>
#include <vector>
#include <set>

class Type{
public:
	typedef int Constant;

	struct Index{
		typedef int	Line;
		typedef int Proc;
		typedef int Var;
	};

	struct Name{
		typedef std::string Proc;
		typedef std::string Var;
	};

	struct Entity{
		typedef enum Line{
			CALL_LINE_ENTITY, ASSIGNMENT_LINE_ENTITY, WHILE_LINE_ENTITY, 
			IF_LINE_ENTITY, ALL_LINE_ENTITY, INVALID_LINE_ENTITY
		};
	};

	struct List{
		typedef std::vector<Index::Line> Line;
		typedef std::vector<Index::Proc> Proc;
		typedef std::vector<Index::Var> Var;
		typedef std::vector<Constant> Constant;
		typedef std::vector<Entity::Line> LineEntity;
		typedef std::vector<bool> Bit;
		typedef std::vector<std::string> Name;
	};

	struct Map{
		typedef std::map<Entity::Line, List::Line> EntityLine;
		typedef std::vector<std::vector<bool>> Bit;
		typedef std::vector<List::Line> LineMatrix;
		typedef std::map<Index::Line, List::Line> Line;
		typedef std::map<Index::Line, Index::Line> ParentMap;
		typedef std::map<Index::Line, ParentMap> ParentMatrix;
	};

	struct Set{
		typedef std::set<Index::Line> Line;
	};

	struct Pair{
		typedef std::pair<Index::Line, Index::Line> StartEnd;
	};
};
#endif